import java.io.IOException;
import java.util.Collection;

import persistence.CargadorEstadisticasXML;
import persistence.XMLHandler;

import business.ClasificadorInterfaz;
import business.ClasificadorNaiveBayes;
import business.Directorio;
import business.DirectorioInterfaz;
import entidad.Articulo;
import entidad.ArticuloClasificado;
import entidad.ArticuloPreClasificado;
import entidad.Estadistica;


public class Main {
	
     /**
     * A partir de un directorio en donde hay articulos en formato xml, ya preclasificados,
     * obtiene probabilidades de cada palabra y las guarda. Estas probabilidades son la base
     * para poder determinar luego si un articulo es interesante o no.
     * @param directorioPath directorio que contiene los articulos en formato xml.
     * @throws Exception si el directorio es invalido.
     */
    public static void aprender(String directorioPath) throws Exception {
        DirectorioInterfaz directorio = new Directorio();
        ClasificadorInterfaz clasificador = new ClasificadorNaiveBayes();
        
        /** Se devuelve una lista con articulos preclasificados obtenidos de un path **/
        Collection<ArticuloPreClasificado> articulosClasificados = directorio.buscarArticulosPreClasificados(directorioPath);
        clasificador.aprender(articulosClasificados);
    }
    
      
    /**
     * A partir de un directorio en donde hay articulos en formato xml, los clasifica
     * en articulos interesantes y no interesantes.
     * @param directorioPath directorio que contiene los articulos en formato xml.
     * @throws IOException si hubo un error al mover los articulos interesantes
     */
    public static void clasificar(String directorioPath) throws Exception {
    	ClasificadorInterfaz clasificador = new ClasificadorNaiveBayes();
    	DirectorioInterfaz directorio = new Directorio();
    	
    	if (!clasificador.isEntrenado()){
    		throw new Exception("No se entreno el clasificador");
    	}		
    	    	
    	Collection<Articulo> articulos = directorio.buscarArticulos(directorioPath);
    	if (articulos.size() > 0){
    		Collection<ArticuloClasificado> articulosClasificados = clasificador.clasificar(articulos);    	
	    	    			    	
	    	String pathArchivo = articulosClasificados.iterator().next().getArchivo();
	    	//mover a interesantes
	    	String directorioInteresantes = pathArchivo.substring(0, pathArchivo.lastIndexOf("\\")) + "/interesantes"; 
	    	directorio.moverInteresantesACarpeta(articulosClasificados, directorioInteresantes);
	    	//mover a no interesantes
	    	String directorioNoInteresantes = pathArchivo.substring(0, pathArchivo.lastIndexOf("\\")) + "/nointeresantes";
	    	directorio.moverNoInteresantesACarpeta(articulosClasificados, directorioNoInteresantes);
    	}
	}
    
    public static void main(String[] args) {
     
        try {
        	
            String pathDirectorio = " ";
            aprender(pathDirectorio);
           	clasificar(pathDirectorio);
            
        } catch (Exception e) {
            System.out.println("Existen alguno de los siguientes errores: ");
            System.out.println("\nEl directorio ingresado es invalido");
            System.out.println("\nAlguno de los archivos de mail esta mal formado. Revisar el log para mas detalles");
        	System.out.println("\nPara poder clasificar, primero debe realizar la operacion de aprender. Comando -ad directorio");
        	System.out.println("\nError al querer mover los mails clasificados como spam");
        }
    	
    }
    
}